import store from '@/store'
import axios from 'axios'
import {
	Message,
	MessageBox
} from 'element-ui'
import {
	isPlainObject
} from 'lodash'
import qs from 'qs'
import util from '@/libs/util'
import { TRUE } from 'sass'

// 记录和显示错误
function errorLog(msg) {
	const error = new Error(msg);
	// 添加到日志
	store.dispatch('d2admin/log/push', {
		message: '数据请求异常',
		type: 'danger',
		meta: {
			error
		}
	})
	// 打印到控制台
	if (process.env.NODE_ENV === 'development') {
		util.log.danger('>>>>>> Error >>>>>>')
		console.log(error)
	}
	Message({
		message: error.message,
		type: 'error',
		duration: 2500
	})
	throw error
}

// 创建一个 axios 实例
const service = axios.create({
	baseURL: process.env.VUE_APP_API,
	timeout: 1000 * 180 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
	config => {
		// 在请求发送之前做一些处理
		// 让每个请求携带token-- ['Mema-Token']为自定义key 请根据实际情况自行修改
		config.headers['Mema-Token'] = util.cookies.get('Mema-Token');
		config.headers['Accept-Language'] = util.cookies.get('language') || 'zh-chs';

		// 默认参数
		const defaults = {}
		// 防止缓存，GET请求默认带_t参数
		if (config.method === 'get') {
			config.params = {
				...config.params,
				...{
					_t: new Date().getTime()
				}
			}
		}

		if (isPlainObject(config.params)) {
			config.params = {
				...defaults,
				...config.params
			}
		}
		if (isPlainObject(config.data)) {
			config.data = {
				...defaults,
				...config.data
			}
			if (/^application\/x-www-form-urlencoded/.test(config.headers['content-type'])) {
				config.data = qs.stringify(config.data)
			}
		}

		return config
	},
	error => {
		// 发送失败
		console.log(error)
		// Promise.reject(error).then(r => )
	}
)

// 响应拦截器
service.interceptors.response.use(
	response => {
		// dataAxios 是 axios 返回数据中的 data
		const dataAxios = response.data
		// 这个状态码是和后端约定的
		const {
			code,
			message,
			data
		} = dataAxios
		// const { code, message, data } = dataAxios
		// 根据 code 进行判断
		if (code === undefined) {
			// 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
			return dataAxios
		} else {
			// 有 code 代表这是一个后端接口 可以进行进一步的判断
			switch (code) {
				//mock环境code 0
				//公司环境code 200
				case 200:
					if(response.config.url.indexOf('/api/delivery/payment/getOrderDetail/')>-1){
						return dataAxios
					}else{
						return data
					}
					// console.log(data);
					// [ 示例 ] code === 200 代表没有错误
					
					// 用户不存在或者密码错误
					break;
				case 301:
					errorLog(message);
					break;
				case 401:
					errorLog(message);
					break;
				case 402:
					// [ 示例 ] 其它和后台约定的 code
					store.dispatch('d2admin/account/logout');
					errorLog(message ? (message + '，请重新登录') : '登录失效，请重新登录');
					break;
				case 403:
					errorLog(message);
					break;
				case 407:
					console.log(data)
					if (Array.isArray(data)) {
						let d_len = data.length;
						if (d_len) {
							let html_String = '';
							html_String += "<div style='height:350px;overflow:auto;'>"
							for (var i = 0; i < d_len; i++) {
								if (data[i]) {
									html_String += `<span>${data[i]}</span></br>`
								}
							}
							html_String += '</div>'
							MessageBox.alert(html_String, {
								title: '结果提示',
								dangerouslyUseHTMLString: true
							})
						}
					}
					return {
						code: 407, data
					}
				case 408:
					console.log(data)
					if (Array.isArray(data)) {
						let d_len = data.length;
						if (d_len) {
							let html_String = '';
							html_String += "<div style='height:350px;overflow:auto;'>"
							for (var i = 0; i < d_len; i++) {
								if (data[i]) {
									html_String += `<span>${data[i]}</span></br>`
								}
							}
							html_String += '</div>'
							MessageBox.alert(html_String, {
								title: '结果提示',
								dangerouslyUseHTMLString: true
							})
						}
					}
					return {
						code: 408, data
					}

				case 409:
					console.log(data)
					if (Array.isArray(data)) {
						let d_len = data.length;
						if (d_len) {
							let html_String = '';
							html_String += "<div style='height:350px;overflow:auto;'>"
							for (var i = 0; i < d_len; i++) {
								if (data[i]) {
									html_String += `<span>${data[i]}</span></br>`
								}
							}
							html_String += '</div>'
							MessageBox.alert(html_String, {
								title: '结果提示',
								dangerouslyUseHTMLString: true
							})
						}
					}
					return {
						code: 409, data
					}
					break;
				case 410:
					console.log(data)
					if (Array.isArray(data)) {
						let d_len = data.length;
						if (d_len) {
							let html_String = '';
							html_String += "<div style='height:350px;overflow:auto;'>"
							for (var i = 0; i < d_len; i++) {
								if (data[i]) {
									html_String += `<span>${data[i]}</span></br>`
								}
							}
							html_String += '</div>'
							MessageBox.alert(html_String, {
								title: '结果提示',
								dangerouslyUseHTMLString: true
							})
						}
					}
					return dataAxios
					break;	
				default:
					// [ 示例 ] 其它和后台约定的 code
					// console.log(response.config.url);
					if(response.config.url.indexOf('/api/delivery/payment/getOrderDetail/')>-1){
						return Promise.resolve(dataAxios); 
					}else{
						errorLog(`接口出错：[ code: ${code} ] ${message}`);
						return Promise.reject(message);
					}
			}
		}
	},
	error => {
		if (error && error.response) {
			switch (error.response.status) {
				case 400:
					error.message = '请求错误';
					break
				case 401:
					error.message = '未授权，请登录';
					break
				case 403:
					error.message = '拒绝访问';
					break
				case 404:
					error.message = `请求地址出错: ${error.response.config.url}`;
					break
				case 408:
					error.message = '请求超时';
					break
				case 500:
					error.message = '服务器内部错误';
					break
				case 501:
					error.message = '服务未实现';
					break
				case 502:
					error.message = '网关错误';
					break
				case 503:
					error.message = '服务不可用';
					break
				case 504:
					error.message = '网关超时';
					break
				case 505:
					error.message = 'HTTP版本不受支持';
					break
				default:
					break
			}
		}
		errorLog(error)
		return Promise.reject(error)
	}
)

export default service